# 需求：封装代码，复用方便
# 只有增删改查的代码会有变化，要使用公有方法，方便别人调用。其它的使用私有方法定义，不需要别人调用

# 导包
import pymysql

# 创建工具类
class DBTool():
    # 在当前工具类中，需要随时使用cls.属性的方式来获取类属性，所以我们可以把con和cur保存在类属性中，方便使用
    # 初始值为none即可
    __con = None
    __cur = None


    # 此处定义类方法，因为后面不需要实例化后调用，只需要类名点出来方法即可。
    @classmethod
    def __get_con(cls):
        cls.__con = pymysql.connect(
            host="localhost",
            port=3306,
            user="root",
            password="123456",
            database="books")
        return cls.__con

    @classmethod
    def __get_cur(cls):
         # 使用cls.__get_con来获取方法的返回值后，再使用cursor游标方法
        cls.__cur = cls.__get_con().cursor()
        return cls.__cur

    @classmethod
    # 此处代码要执行外部传来的sql语句，一定不能是私有方法
    def exe_sql(cls,sql):
        try:
            cls.__cur = cls.__get_cur()
            cls.__cur.execute(sql)
        #     判断是否为查询语句,查询语句就返回所以结果
        #     print(sql.split())
            if sql.split()[0].lower() == "select":
                return cls.__cur.fetchall()
            # 非查询语句，别忘了提交
            else:
                cls.__con.commit()
                return "成功"

        except Exception as e:
            cls.__con.rollback()
            print(e)

        finally:
            cls.__close_cur()
            cls.__close_con()

    @classmethod
    def __close_cur(cls):
        if cls.__cur:
            cls.__cur.close()
            cls.__cur = None   # 使用完毕，再恢复成初始值，方便下次再使用
    @classmethod
    def __close_con(cls):
        if cls.__con:
            cls.__con.close()
            cls.__con = None


